/**
 * 观察者模式：发布-订阅
 * 发布者：1. 添加订阅者 2. 移除订阅者 3. 通知订阅者
 * 订阅者：接到通知，干活（被调用者）
 * 最基本实现
 */

 // 定义发布类
 class Publisher {
     constructor() {
         this.observers = [];
         console.log('publisher created')
     }
     // 增加订阅者
     add(observer) {
         console.log('publisher.add invoked')
         this.observers.push(observer);
     }
     // 移除订阅者
     remove(observer) {
         console.log('publisher.remove invoked')
         this.observers.forEach((item, i) => {
             if (item === observer) {
                 this.observers.splice(i, 1)
             }
         })
     }
     //  通知所有订阅者
     notify() {
         console.log('publisher.notify invoked')
         this.observers.forEach(observer => {
             observer.update(this);
         })
     }
 }

 // 订阅者
class Observer {
    constructor() {
        console.log('Observer created')
    }

    update() {
        console.log('Observer.update invoked')
    }
}

// 定义一个具体的需求文档发布类
class PrdPublisher extends Publisher {
    constructor() {
        super();
        this.proState = null;
        this.observers == [];
        console.log('PrdPublisher created')
    }

    getState() {
        console.log('PrdPublisher.getState invoked')
        return this.proState
    }

    setState(state) {
        console.log('setState invoked')
        this.proState = state;
        // 需求文档变更，立即通知所有开发者
        this.notify();
    }
}

// 订阅者：开发者：接收需求文档，开干
class DeveloperObserver extends Observer {
    constructor() {
        super();
        this.proState = {};
        console.log('DeveloperObserver created')
    }

    update(publisher) {
        console.log('DeveloperObserver.update invoked')
        // 接收需求文档状态
        this.proState = publisher.getState();
        // 干活
        this.work()
    }

    work() {
        // 获取需求文档
        const prd = this.proState;
        console.log('干活')
    }
}

// 创建订阅者
const liLei = new DeveloperObserver(); //前端
const A = new DeveloperObserver() // 后台
const B = new DeveloperObserver() // 测试
//产品
const C = new PrdPublisher()
//需求文档
const prd = {

}
// 产品拉群
C.add(liLei);
C.add(A)
C.add(B)
//发送文档
C.setState(prd)

function a(state) {
    this.state = state;
    var b = 'mzn'
    console.log(b)
}
var a = new a('33')